package com.hutao.manage.util;

import java.util.Arrays;

import org.apache.commons.lang3.StringUtils;

public class DiseaseValidateUtil {
	// 主要诊断开头格式
	public static final String MAIN_DISEASE_START_STR = "ABCDEFGHIJKLMNOPQRSTUZ";

	// 其他诊断开头格式
	public static final String OTHER_DISEASE_START_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

	// 5岁以上十二岁以上儿童出院诊断不应编为P00-P96(起源于围产期的某些情况)
	public static final String[] P00_P96 = { "P00", "P01", "P02", "P03", "P04", "P05", "P06", "P07", "P08", "P09",
			"P10", "P11", "P12", "P13", "P14", "P15", "P16", "P17", "P18", "P19", "P20", "P21", "P22", "P23", "P24",
			"P25", "P26", "P27", "P28", "P29", "P30", "P31", "P32", "P33", "P34", "P35", "P36", "P37", "P38", "P39",
			"P40", "P41", "P42", "P43", "P44", "P46", "P47", "P48", "P49", "P50", "P51", "P52", "P53", "P54", "P55",
			"P56", "P57", "P58", "P59", "P60", "P61", "P62", "P63", "P64", "P65", "P66", "P67", "P68", "P69", "P70",
			"P71", "P72", "P73", "P74", "P75", "P76", "P77", "P78", "P79", "P80", "P81", "P82", "P83", "P84", "P85",
			"P86", "P87", "P88", "P89", "P90", "P91", "P92", "P93", "P94", "P95", "P96" };

	// 12岁及以下儿童出院诊断不应编为O00-O99(妊娠、分娩和产褥期疾病)
	public static final String[] O00_O99 = { "O00", "O01", "O02", "O03", "O04", "O05", "O06", "O07", "O08", "O09",
			"O10", "O11", "O12", "O13", "O14", "O15", "O16", "O17", "O18", "O19", "O20", "O21", "O22", "O23", "O24",
			"O25", "O26", "O27", "O28", "O29", "O30", "O31", "O32", "O33", "O34", "O35", "O36", "O37", "O38", "O39",
			"O40", "O41", "O42", "O43", "O44", "O45", "O46", "O47", "O48", "O49", "O50", "O51", "O52", "O53", "O54",
			"O55", "O56", "O57", "O58", "O59", "O60", "O61", "O62", "O63", "O64", "O65", "O66", "O67", "O68", "O69",
			"O70", "O71", "O72", "O73", "O74", "O75", "O76", "O77", "O78", "O79", "O80", "O81", "O82", "O83", "O84",
			"O85", "O86", "O87", "O88", "O89", "O90", "O91", "O92", "O93", "O94", "O95", "O96", "O97", "O98", "O99" };

	// 12岁及以下儿童出院诊断不应编为C50-C63(乳房、女性及男性生殖器恶性肿瘤)
	public static final String[] C50_C63 = { "C50", "C51", "C52", "C53", "C54", "C55", "C56", "C57", "C58", "C59",
			"C60", "C61", "C62", "C63" };

	// 12岁及以下儿童出院诊断一般不应编"D24-D29"(乳房、女性及男性生殖器官良性肿瘤)
	public static final String[] D24_D29 = { "D24", "D25", "D26", "D27", "D28", "D29" };

	// 男性出院诊断不应为N80-N98(女性生殖道非炎性疾患)
	public static final String[] N80_N98 = { "N80", "N81", "N82", "N83", "N84", "N85", "N86", "N87", "N88", "N89",
			"N90", "N91", "N92", "N93", "N94", "N95", "N96", "N97", "N98" };

	// 男性出院诊断不应为C51-C58(女性生殖器恶性肿瘤)
	public static final String[] C51_C58 = { "C51", "C52", "C53", "C54", "C55", "C55", "C56", "C57", "C58" };

	// 男性出院诊断不应为C51-C58(女性生殖器恶性肿瘤)
	public static final String[] C70_N77 = { "N70", "N71", "N72", "N73", "N74", "N75", "N76", "N77" };

	public static final String[] D06_N64 = { "D06", "D24", "D25", "D27", "C50", "N60", "N61", "N62", "N63", "N64" };

	// 其它诊断编码不能使用以下编码
	public static final String[] MAN_NOT_FIVE_CODE = { "B37.3", "C79.6", "D07.0", "D07.1", "D07.2", "D07.3", "E89.4",
			"F52.5", "I86.3", "L29.2", "M80.0", "M80.1", "M83.0", "N99.2", "N99.3", "P54.6", "S31.4", "S37.4", "S37.5",
			"S37.6", "T19.2", "T19.3", "T83.3", "Z01.4", "Z30.1", "Z30.3", "Z30.5", "Z31.1", "Z31.2", "Z87.5",
			"Z97.5" };

	// 其它诊断编码不能使用以下编码
	public static final String[] MAN_NOT_THREE_CODE = { "A34", "C51", "C52", "C53", "C54", "C55", "C56", "C57", "C58",
			"D06", "D25", "D26", "D27", "D28", "D39", "E28", "F53", "N70", "N71", "N72", "N73", "N74", "N75", "N76",
			"N77", "N78", "N79", "N80", "N81", "N82", "N83", "N84", "N85", "N86", "N87", "N88", "N89", "N90", "N91",
			"N92", "N93", "N94", "N95", "N96", "N97", "N98", "Q50", "Q51", "Q52", "R87", "Z32", "Z33", "Z34", "Z35",
			"Z36", "Z37", "Z39", "O00", "O01", "O02", "O03", "O04", "O05", "O06", "O07", "O08", "O09", "O10", "O11",
			"O12", "O13", "O14", "O15", "O16", "O17", "O18", "O19", "O20", "O21", "O22", "O23", "O24", "O25", "O26",
			"O27", "O28", "O29", "O30", "O31", "O32", "O33", "O34", "O35", "O36", "O37", "O38", "O39", "O40", "O41",
			"O42", "O43", "O44", "O45", "O46", "O47", "O48", "O49", "O50", "O51", "O52", "O53", "O54", "O55", "O56",
			"O57", "O58", "O59", "O60", "O61", "O62", "O63", "O64", "O65", "O66", "O67", "O68", "O69", "O70", "O71",
			"O72", "O73", "O74", "O75", "O76", "O77", "O78", "O79", "O80", "O81", "O82", "O83", "O84", "O85", "O86",
			"O87", "O88", "O89", "O90", "O91", "O92", "O93", "O94", "O95", "O96", "O97", "O98", "O99" };

	// 性别为男性时门诊诊断不能为一下编码开头的编码
	public static final String[] CLINIC_DIAGNOSIS_MAN_NOT_CODE_FIVE = { "B37.3", "C79.6", "D07.0", "D07.1", "D07.2",
			"D07.3", "E89.4", "F52.5", "I86.3", "M80.0", "M80.1", "M81.0", "M81.1", "M83.0", "N99.2", "N99.3", "S31.4",
			"L29.2", "P54.6", "S37.4", "S37.6", "T19.2", "T19.3", "T83.3", "Z01.4", "Z12.4", "Z30.1", "Z30.3", "Z30.5",
			"Z31.1", "Z31.2", "Z87.5", "Z97.5"

	};
	
	
	
	
	
	

	// 性别为男性时门诊诊断不能为一下编码开头的编码
	public static final String[] CLINIC_DIAGNOSIS_MAN_NOT_CODE_THREE = { "A34", "C51", "C52", "C53", "C54", "C55",
			"C55", "C56", "C57", "C58", "D06", "D06", "D25", "D26", "D27", "D28", "F53", "N70", "N71", "N72", "N73",
			"N74", "N75", "N76", "N77", "N78", "N79", "N80", "N81", "N82", "N83", "N84", "N85", "N86", "N87", "N88",
			"N89", "N90", "N91", "N92", "N93", "N94", "N95", "N96", "N97", "N98", "O00", "O01", "O02", "O03", "O04",
			"O05", "O06", "O07", "O08", "O09", "O10", "O11", "O12", "O13", "O14", "O15", "O16", "O17", "O18", "O19",
			"O20", "O21", "O22", "O23", "O24", "O25", "O26", "O27", "O28", "O29", "O30", "O31", "O32", "O33", "O34",
			"O35", "O36", "O37", "O38", "O39", "O40", "O41", "O42", "O43", "O44", "O45", "O46", "O47", "O48", "O49",
			"O50", "O51", "O52", "O53", "O54", "O55", "O56", "O57", "O58", "O59", "O60", "O61", "O62", "O63", "O64",
			"O65", "O66", "O67", "O68", "O69", "O70", "O71", "O72", "O73", "O74", "O75", "O76", "O77", "O78", "O79",
			"O80", "O81", "O82", "O83", "O84", "O85", "O86", "O87", "O88", "O89", "O90", "O91", "O92", "O93", "O94",
			"O95", "O96", "O97", "O98", "O99", "Q50", "Q51", "Q52", "R87", "Z32", "Z33", "Z34", "Z35", "Z36", "Z37",
			"Z39" };

	// ----------------------------------------------------------
	// 性别为女性时主要诊断编码不能为
	public static String[] FEMAL_MAIN_DISEASE_CODE_THREE = { "N40", "N41", "N42", "N43", "N44", "N45", "N46", "N46",
			"N47", "N48", "N49", "N50", "N51", "C60", "C61", "C62", "C63", "K40", "K40", "C60", "C61", "C62", "C63",
			"D29", "D40", "E29", "Q53", "Q54", "Q55", "R86", "D40" };
	// 性别为女性时主要诊断编码不能为
	public static String[] FEMAL_MAIN_DISEASE_CODE_FIVE = { "B26.0", "D07.4", "D07.5", "D07.5", "D07.6", "D17.6",
			"E89.5", "F52.4", "I86.1", "L29.1", "S31.2", "S31.3", "Z12.5" ,"D29.1"};

	//性别为女性时其他诊断不为一下开头的编码
	public static String[] FEMAL_OTHER_DISEASE_CODE_THREE={"C60", "C61", "C62", "C63","D29","D40","E29","N40", "N41", "N42", "N43", "N44", "N45", "N46",
			"N47", "N48", "N49", "N50", "N51", "Q53","Q54","Q55","R86"};
	
	//性别为女性时其他诊断不为一下开头的编码
	public static String[] FEMAL_OTHER_DISEASE_CODE_FIVE={"B26.0","D07.4","D07.5","D07.6","D17.6","E89.5","F52.4","I86.1","L29.1","S31.2","S31.3","Z12.5"};
	
	
	//性别为女性时门诊诊断不应为以下开头的编码
	public static String [] FEMAL_CLINIC_DISEASE_CODE_THREE={
			"C60", "C61", "C62", "C63","D29","N40", "N41", "N42", "N43", "N44", "N45", "N46","N47", "N48", "N49", "N50", "N51",
			"D29","D40","E29","Q53","Q54","Q55","R86"
	};
	
	//性别为女性时门诊诊断不应为以下开头的编码
	public static String[] FEMAL_CLINIC_DISEASE_CODE_FIVE={
			"B26.0","D07.4","D07.5","D07.6","D17.6","E89.5","F52.4","I86.1","L29.1","S31.2","S31.3","Z12.5"
	};
	
	
	//以下编码不能作为主要诊断编码
	public static String [] MAIN_DISEASE_NOT_CODE={"B95","B96","B97","O06","Z91","Z92","Z93","Z94","Z95","Z96","Z97","Z98","Z99","T32","Z80","Z81","Z82","Z83","Z84","M99","Z37","Z38","Z85","Z86","Z87","Z88","Z89","Z90"};
	
	//以下编码隐含医疗风险
	public static String [] MAIN_DISEASE_HASE_RAISE={"T80","T81","T82","T83","T84","T85","T86","T87","T88"};
	
	/**
	 * 校验主要诊断疾病编码规则 @param diagTypeCode
	 * 
	 * @return
	 */
	public static boolean validateMainDiseaseTypeRule(String diagTypeCode, String diseaseDiagCode) {
		if (StringUtils.isNotEmpty(diagTypeCode) && diagTypeCode.equals("3")) {
			if (StringUtils.isNoneEmpty(diseaseDiagCode)) {
				String startIndex = diseaseDiagCode.substring(0, 1);
				if (MAIN_DISEASE_START_STR.indexOf(startIndex) == -1) {
					return false;
				}
			}
		}
		return true;
	}
	
	
	public static boolean validateDiagCode(String diagTypeCode, String diseaseDiagCode){
		
			if (StringUtils.isEmpty(diseaseDiagCode)) {
				
					return false;
				
			}
		
		return true;
	}
	
	

	/**
	 * 其他诊断疾病编码规则 @"Param diagTy"PeCode @"Param diseaseDiagCode
	 * 
	 * @return
	 */
	public static boolean validateOtherDiseaseTypeRule(String diagTypeCode, String diseaseDiagCode, String diagType) {
		if (StringUtils.isNotEmpty(diagTypeCode) && diagTypeCode.equals(diagType)) {
			if (StringUtils.isNotEmpty(diseaseDiagCode)) {
				String startIndex = diseaseDiagCode.substring(0, 1);
				if (OTHER_DISEASE_START_STR.indexOf(startIndex) == -1) {
					return false;
				}
			}
		}
		return true;
	}

	/**
	 * 5岁以上十二岁以下儿童出院诊断不应编为P00-P96(起源于围产期的某些情况)
	 * 
	 * @param age
	 * @param diagTypeCode
	 * @param diseaseDiagCode
	 * @return
	 */
	public static boolean validateChildDisease(long age, String diagTypeCode, String diseaseDiagCode,
			String[] diseaseCodeArray) {
		if (StringUtils.isNotEmpty(diagTypeCode) && diagTypeCode.equals("3") && age <= 12) {
			if(StringUtils.isNoneEmpty(diseaseDiagCode)){
				
				String code = diseaseDiagCode.substring(0, 3);
				if (Arrays.asList(diseaseCodeArray).contains(code)) {
					return false;
				}
			}
		}

		return true;
	}

	/**
	 * 校验男性疾病
	 * 
	 * @param diagTypeCode
	 * @param diseaseDiagCode
	 * @return
	 */
	public static Result validateManDisease(String sexName, String diagTypeCode, String diseaseDiagCode) {
		if(StringUtils.isEmpty(diseaseDiagCode)){
			return new Result(true);
		}
		String code3 = diseaseDiagCode.substring(0, 3);
		String code5 = diseaseDiagCode.substring(0, 5);
		if (StringUtils.isNotEmpty(diagTypeCode) && diagTypeCode.equals("3")) {
			//主要诊断不能为一下编码
			if (Arrays.asList(MAIN_DISEASE_NOT_CODE).contains(code3)) {
				return new Result(false, code3+"开头的编码不能作为主要诊断编码!");
			}
			// 男性出院诊断不应为N80-N98(女性生殖道非炎性疾患)
			if (Arrays.asList(MAIN_DISEASE_HASE_RAISE).contains(code3)) {
				return new Result(false, "以"+code3+"开头的编码作为主要诊断编码,可能隐含医疗风险!");
			}
		}
		
		
		if (sexName.equals("男")) {

			if (StringUtils.isNotEmpty(diagTypeCode) && diagTypeCode.equals("3")) {

				if (Arrays.asList(O00_O99).contains(code3)) {
					return new Result(false, "男性出院诊断不应为O00-099(妊娠、分娩和产褥期疾病)");
				}
				// 男性出院诊断不应为N80-N98(女性生殖道非炎性疾患)
				if (Arrays.asList(N80_N98).contains(code3)) {
					return new Result(false, "男性出院诊断不应为N80-N98(女性生殖道非炎性疾患)");
				}

				// 男性出院诊断不应为C51-C58(女性生殖器恶性肿瘤)
				if (Arrays.asList(C51_C58).contains(code3)) {
					return new Result(false, "男性出院诊断不应为C51-C58(女性生殖器恶性肿瘤))");
				}

				// 男性出院诊断不应为N70-N77(女性盆腔器官炎性疾患)
				if (Arrays.asList(C70_N77).contains(code3)) {
					return new Result(false, "男性出院诊断不应为N70-N77(女性盆腔器官炎性疾患))");
				}

				// 男性出院诊断不应为"D06","D24","D25","D27","C50","N60","N61","N62","N63","N64"
				if (Arrays.asList(D06_N64).contains(code3)) {
					return new Result(false, "男性出院诊断不应为D06,D24,D25,D27,C50,N60-N64(女性疾病)");
				}

			}

			if (StringUtils.isNotEmpty(diagTypeCode) && diagTypeCode.equals("A")) {
				// 男性其他诊断
				if (Arrays.asList(MAN_NOT_THREE_CODE).contains(code3)) {
					return new Result(false, "男性其他诊断不应为" + code3);
				}

				if (Arrays.asList(MAN_NOT_FIVE_CODE).contains(code5)) {
					return new Result(false, "男性其他诊断不应为" + code5);
				}
			}

			if (StringUtils.isNotEmpty(diagTypeCode) && diagTypeCode.equals("1")) {
				// 男性其他诊断
				if (Arrays.asList(CLINIC_DIAGNOSIS_MAN_NOT_CODE_THREE).contains(code3)) {
					return new Result(false, "当性别为男性时门诊诊断不应为" + code3 + "开头的疾病编码");
				}

				if (Arrays.asList(CLINIC_DIAGNOSIS_MAN_NOT_CODE_FIVE).contains(code5)) {
					return new Result(false, "当性别为男性时门诊诊断不应为" + code5 + "开头的疾病编码");
				}
			}

		}
		
		if(sexName.equals("女")){
			if (StringUtils.isNotEmpty(diagTypeCode) && diagTypeCode.equals("3")) {
				if (Arrays.asList(FEMAL_MAIN_DISEASE_CODE_FIVE).contains(code5)) {
					return new Result(false, "当性别为女性时主要诊断不应为" + code5 + "开头的疾病编码");
				}
				
				if (Arrays.asList(FEMAL_MAIN_DISEASE_CODE_THREE).contains(code3)) {
					return new Result(false, "当性别为女性时主要诊断不应为" + code3 + "开头的疾病编码");
				}
			}
			
			if (StringUtils.isNotEmpty(diagTypeCode) && diagTypeCode.equals("A")) {
				if (Arrays.asList(FEMAL_OTHER_DISEASE_CODE_FIVE).contains(code5)) {
					return new Result(false, "当性别为女性时其他诊断不应为" + code5 + "开头的疾病编码");
				}
				
				if (Arrays.asList(FEMAL_OTHER_DISEASE_CODE_THREE).contains(code3)) {
					return new Result(false, "当性别为女性时其他诊断不应为" + code3 + "开头的疾病编码");
				}
			}
			
			
			if (StringUtils.isNotEmpty(diagTypeCode) && diagTypeCode.equals("1")) {
				if (Arrays.asList(FEMAL_CLINIC_DISEASE_CODE_FIVE).contains(code5)) {
					return new Result(false, "当性别为女性时门诊诊断不应为" + code5 + "开头的疾病编码");
				}
				
				if (Arrays.asList(FEMAL_CLINIC_DISEASE_CODE_THREE).contains(code3)) {
					return new Result(false, "当性别为女性时门诊诊断不应为" + code3 + "开头的疾病编码");
				}
			}
		}
		
		
		

		return new Result(true);
	}

}
